home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / PCCP024.ARJ / XMCRCS.C < prev    next >
Text File  |  1992-05-17  |  3KB  |  185 lines

  1. /*    Copyright (C) 1992 Peter Edward Cann, all rights reserved.
  2.  *    MicroSoft QuickC
  3.  */
  4.  
  5. #include<stdio.h>
  6. #include<bios.h>
  7. #include<dos.h>
  8. #include<fcntl.h>
  9. #include<sys\types.h>
  10. #include<sys\stat.h>
  11. #include<signal.h>
  12. #include"port.h"
  13.  
  14. #define NAK 21
  15. #define ACK 6
  16. #define SOH 1
  17. #define EOT 4
  18. #define CAN 24
  19.  
  20. sendchar(c)
  21.     unsigned char c;
  22.     {
  23.     while(!((inp(basereg+STATREG)&TXMTMASK)&&(inp(basereg+MSTATREG)&CTSMASK)));
  24.     outp(basereg, c);
  25.     }
  26.  
  27. int follow;
  28.  
  29. int rcharto(ticks)
  30.     int ticks;
  31.     {
  32.     long tstamp, tstamp1, dayofticksp;
  33.     int c;
  34.     _bios_timeofday(_TIME_GETCLOCK, &tstamp);
  35.     dayofticksp=0;
  36.     while(1)
  37.         {
  38.         if(_bios_timeofday(_TIME_GETCLOCK, &tstamp1))
  39.             dayofticksp+=20*60*60*24;
  40.         if(tstamp1+dayofticksp-tstamp>ticks)
  41.             return(-1); /* NOTE: This is an INT!!! */
  42.         if(follow!=index)
  43.             {
  44.             c=buf[follow++];
  45.             follow=follow%TBUFSIZ;
  46.             return(c);
  47.             }
  48.         }
  49.     }
  50.  
  51. int calccrc(ptr, count)
  52.     char *ptr;
  53.     int count;
  54.     {
  55.     int crc, i;
  56.     crc = 0;
  57.     while(--count >= 0)
  58.         {
  59.         crc = crc ^ (int)*ptr++ << 8;
  60.         for(i = 0; i < 8; ++i)
  61.             if(crc & 0x8000)
  62.                 crc = crc << 1 ^ 0x1021;
  63.             else
  64.                 crc = crc << 1;
  65.         }
  66.     return (crc & 0xFFFF);
  67.     }
  68.  
  69. unsigned char block[128];
  70.  
  71. sblock(blockn)
  72.     int blockn;
  73.     {
  74.     unsigned char c;
  75.     unsigned short crc, rcrc;
  76.     int i;
  77.     crc=calccrc(block, 128);
  78.     sendchar(SOH);
  79.     sendchar(blockn);
  80.     sendchar((blockn^0xff)&0xff);
  81.     for(i=0;i<128;++i)
  82.         sendchar(block[i]);
  83.     sendchar((crc>>8)&0xff);
  84.     sendchar(crc&0xff);
  85.     }
  86.  
  87. quit()
  88.     {
  89.     cleanup();
  90.     exit(99);
  91.     }
  92.  
  93. main(argc, argv)
  94.     int argc;
  95.     char **argv;
  96.     {
  97.     int i, j, infd, ok, c;
  98.     unsigned char blocknum;
  99.     long nbytes;
  100.     index=follow=0;
  101.     printf("Copyright (C) 1992 Peter Edward Cann, all rights reserved.\n");
  102.     printf("xmodem crc send of %s.\n", argv[4]);
  103.     if(argc!=5)
  104.         {
  105.         printf("USAGE: xmodemr <comnum> <bps> <stopbits> <file pathname>\n");
  106.         exit(1);
  107.         }
  108.     if((infd=open(argv[4], O_RDONLY|O_BINARY))==-1)
  109.         {
  110.         printf("Error opening file %s.\n", argv[4]);
  111.         exit(2);
  112.         }
  113.     comnum=atoi(argv[1])-1;
  114.     speed=atoi(argv[2]);
  115.     databits='8';
  116.     parity='n';
  117.     stopbits=argv[3][0];
  118.     setport();
  119.     signal(SIGINT, quit);
  120.     readset();
  121.     setup();
  122.     nbytes=0;
  123.     if(rcharto(2000)!='C')
  124.         {
  125.         printf("Spurrious char or no C in 100 seconds.\n");
  126.         cleanup();
  127.         exit(10);
  128.         }
  129.     blocknum=1;
  130.     while(1)
  131.         {
  132.         if((j=read(infd, block, 128))==0)
  133.             {
  134.             printf("\nEnd of file.\n");
  135.             sendchar(EOT);
  136.             do
  137.                 c=rcharto(300);
  138.             while((c!=ACK)&&(c!=NAK)&&(c!=CAN)&&(c!=-1));
  139.             if(c!=ACK)
  140.                 {
  141.                 printf("No ACK of EOT.\n");
  142.                 cleanup();
  143.                 exit(13);
  144.                 }
  145.             else
  146.                 {
  147.                 printf("Successful.\n");
  148.                 cleanup();
  149.                 exit(0);
  150.                 }
  151.             }
  152.         for(c=j;c<128;c++)
  153.             block[c]=26;
  154.         i=0;
  155.         do
  156.             {
  157.             printf("\nSending block %d. ", blocknum);
  158.             sblock(blocknum);
  159.             do
  160.                 c=rcharto(200);
  161.             while((c!=ACK)&&(c!=NAK)&&(c!=CAN)&&(c!=-1));
  162.             }
  163.         while((c==NAK)&&(i++<10));
  164.         if(c!=ACK)
  165.             if(c==NAK)
  166.                 {
  167.                 printf("\nRetry limit exceeded.\n");
  168.                 cleanup();
  169.                 exit(14);
  170.                 }
  171.             else
  172.                 {
  173.                 printf("\nSpurrious character hex %02x; ACK or NAK expected.\n", c);
  174.                 cleanup();
  175.                 exit(11);
  176.                 }
  177.         nbytes+=128;
  178.         printf("Successful. Bytes so far: %ld", nbytes);
  179.         blocknum++;
  180.         }
  181.     printf("Programming error; fell through end; see code.\n");
  182.     cleanup();
  183.     exit(12);
  184.     }
  185.